using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class SectorRange : MonoBehaviour
{
    //扇形范围的材质
    [SerializeField] private Material m_Material;
    //扇形角度，限制为1-360度
    [SerializeField][Range(1f, 360f)] private float m_angle = 360f;
    //扇形半径，限制为0.1-20
    [SerializeField][Range(0.1f, 360f)] private float radius = 3.0f;
    //扇形的精度，限制为1-60
    [SerializeField][Range(1, 60)] private int quality = 6; 
    //存放网格数据的组件
    private MeshFilter m_MeshFilter;
    //渲染网格的组件
    private MeshRenderer m_MeshRenderer;
    //网格对象
    private GameObject sectorObj;


    void Start()
    {
        //扇形对象为空时，新建一个对象
        sectorObj = new GameObject("Sector");
        sectorObj.transform.SetParent(transform, false);
        m_MeshFilter = sectorObj.AddComponent<MeshFilter>();
        m_MeshRenderer = sectorObj.AddComponent<MeshRenderer>();
        
    
    }

    // 控制模式枚举
    private enum ControlMode
    {
        Mouse,
        Joystick
    }
    
    // 当前控制模式
    private ControlMode currentControlMode = ControlMode.Mouse;
    // 鼠标是否移动的标志
    // private bool isMouseMoving = false;
    // 摇杆是否激活的标志
    // private bool isJoystickActive = false;
    
    // Update is called once per frame

    private void ShowSector()
    {
        //更新网格
        sectorObj = GetSector(Vector3.zero, m_angle, radius, quality);
        //显示网络
        sectorObj.SetActive(true);
    }

    private void HideSector()
    {
        if (sectorObj != null)
        {
            sectorObj.SetActive(false);
        }
    }
    
    //获取扇形网格
    private GameObject GetSector(Vector3 center, float angle, float radius, int triangleCount)
    {
        //每个三角形的角度
        float eachAngle = angle / triangleCount;
        //网格顶点数组
        List<Vector3> vertices = new List<Vector3>();
        //添加第一个顶点为扇形的圆心
        vertices.Add(center);
        //获取扇形所有顶点位置
        for (int i = 0; i <= triangleCount; i++)
        {
            Vector3 vertex = Quaternion.Euler(0, 0, angle / 2 - eachAngle * i) * Vector3.up * radius;
            vertices.Add(vertex);
        }
        //根据顶点数组创建网格
        return CreateSectorMesh(vertices);
    }
    
    //根据顶点数组创建网格
    private GameObject CreateSectorMesh(List<Vector3> vertices)
    {
        //三角形顶点索引数组
        int[] triangles;
        //三角形的数量
        int triangleAmount = vertices.Count - 2; 
        //三角形顶点总数 = 3 * 三角形数量
        triangles = new int[3 * triangleAmount];
        //设置网格三角形顶点排列
        for (int i = 0; i < triangleAmount; i++)
        {
            triangles[3 * i] = 0;
            triangles[3 * i + 1] = i + 1;
            triangles[3 * i + 2] = i + 2;
        }
        //设置网格uv数组
        Vector2[] uvs = new Vector2[vertices.Count];
        uvs[0] = new Vector2(vertices[0].x, vertices[0].y);
        for (int i = 1; i < uvs.Length; i++)
        {
            uvs[i] = new Vector2(vertices[i].x, 1);
        }
        
        //新建一个网格，设置网格
        Mesh mesh = new Mesh();
        mesh.vertices = vertices.ToArray();
        mesh.triangles = triangles;
        mesh.uv = uvs;
        //指定扇形对象的网格和材质
        m_MeshFilter.mesh = mesh;
        m_MeshRenderer.material = m_Material;
        return sectorObj;
    }
    
    // //获取更新位置（摇杆输入）
    // public void updatePos(Vector3 pos)
    // {
    //     // 检测是否有有效的摇杆输入
    //     if (pos.magnitude > 0.1f)
    //     {
    //         // 设置摇杆激活标志
    //         isJoystickActive = true;
            
    //         // 将方向向量转换为世界坐标中的目标点
    //         // 计算一个足够远的点，确保子弹有足够的移动空间
    //         mouseWorldPos = transform.position + pos * 10f;
            
    //         // 计算角色到目标点的方向矢量
    //         direction = pos.normalized;
            
    //         // 使角色朝向摇杆方向
    //         transform.up = direction;
    //     }
    //     else
    //     {
    //         // 如果摇杆输入很小，可以考虑不更新方向
    //         // 但保持摇杆激活状态，直到明确的joystickUp事件
    //     }
    // }
    
    // public void onJoystickUp()
    // {
    //     // Debug.Log("弹起")
    //     HideSector();
        
    //     // 重置摇杆激活标志
    //     isJoystickActive = false;
    // }
    
    // public void onJoystickDown()
    // {
    //     // Debug.Log("按下");
    //     ShowSector();
        
    //     // 设置摇杆激活标志
    //     isJoystickActive = true;
    // }   
}
